2010-08-26 11:19:00
近来遇上一个很诡异的 bug:InternetOpenURL 内部发生 crash。虽说发生问题的时刻总是处于这个 API 内部,可也一直不敢确定不是其他原因引起的,就这么一直拖着。
前两天终于有可以随时操作的且重现几率非常高的机器了,测试了一下,发现一个规律:只要在调用 InternetOpenURL 之前调用过 SHGetFolderPath,此问题的重现几率就非常高;如果没有调用过 SHGetFolderPath,则基本不出现。
目前网上找到的一个几乎唯一的帖子是 http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/2982efc6-8403-4577-9dba-ad5cfdf01753,现象几乎一模一样。只可惜没有有价值的回复。该文章的作者指出的 VPN 等网络原因好像不是关键,在我这里是很普通的局域网,一样能出现。
测试代码如下:
1#include <Windows.h>
2#include <tchar.h>
3#include <ShlObj.h>
4
5#include <WinInet.h>
6#pragma comment(lib, "wininet.lib")
7
8#define URL _T("http://www.baidu.com/")
9
10int main()
11{
12 TCHAR szCommonAppData[MAX_PATH];
13 SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, szCommonAppData);
14
15 HINTERNET hInternet = InternetOpen(_T("WCU"), INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);
16
17 if (hInternet == NULL)
18 {
19 return 0;
20 }
21
22 HINTERNET hInternetFile = InternetOpenUrl(hInternet, URL, NULL, 0, INTERNET_FLAG_NO_UI | INTERNET_FLAG_RELOAD, 0);
23
24 if (hInternetFile == NULL)
25 {
26 InternetCloseHandle(hInternet);
27 return 0;
28 }
29
30 InternetCloseHandle(hInternetFile);
31 InternetCloseHandle(hInternet);
32
33 return 0;
34}
在能够出现此问题的机器上,Ctrl + F5 直接运行,几乎每次必现;如果 F5 调试运行,则几率小一点,但是跑个七八次左右基本上能出现。目前 XP 32/64 上都有发现这个问题,Vista/Win7 上暂时没有发生此现象。(如果 InternetOpenURL 换成 InternetConnect、HttpOpenRequest、HttpSendrequest,则会 crash 在 HttpSendRequest 内。)
附件是一个测试工程,附带上了 Debug、Release 版本的 EXE、PDB 文件以及 Crash 时的 Dump 文件。请有心人帮忙看看。^_^
可是,如果这个问题确实存在,为什么网上查到的相关内容这么少呢?奇怪~
首发:http://www.cppblog.com/Streamlet/archive/2010/08/26/124787.html